package com.ddm.utils;

import io.jsonwebtoken.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;
@Slf4j
@Component
public class WebJwtUtil {

    @Value("${cx.jwt.webSecretKey}")
    private String secret;

    @Value("${cx.jwt.webTtl}")
    private Long expiration;

    public String generateToken(Map<String, Object> claims) {
        log.debug("生成 Token 的 Claims: {}", claims);
        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
//                .signWith(SignatureAlgorithm.HS256, secret)
                .signWith(SignatureAlgorithm.HS256, secret.getBytes(StandardCharsets.UTF_8))
                .compact();
    }

    // 解析 JWT Token 方法
    public  Claims parseJwt(String token) {
        try {
            // 验证并解析 Token
            return Jwts.parser()
//                    .setSigningKey(secret)
                    // 在 WebJwtUtil 的 parseJwt 方法中修改密钥处理
                    .setSigningKey(secret.getBytes(StandardCharsets.UTF_8))  // 显式指定 UTF-8 编码
                    .parseClaimsJws(token)
                    .getBody();
        } catch (ExpiredJwtException e) {
            // Token 过期
            log.error("Token 已过期: {}", e.getMessage());
            throw e;
        } catch (UnsupportedJwtException e) {
            // 不支持的 Token 格式
            log.error("不支持的 JWT 格式: {}", e.getMessage());
            throw e;
        } catch (MalformedJwtException e) {
            // Token 格式错误
            log.error("JWT 格式错误: {}", e.getMessage());
            throw e;
        } catch (SignatureException e) {
            // 签名验证失败
            log.error("JWT 签名验证失败: {}", e.getMessage());
            throw e;
        } catch (IllegalArgumentException e) {
            // 参数错误
            log.error("JWT 参数错误: {}", e.getMessage());
            throw e;
        }
    }
//    public String extractUsername(String token) {
//        Claims claims = extractAllClaims(token);
//        return claims.getSubject();
//    }
//
//    public Date extractExpiration(String token) {
//        Claims claims = extractAllClaims(token);
//        return claims.getExpiration();
//    }
//
//    private Claims extractAllClaims(String token) {
//        return Jwts.parser()
//                .setSigningKey(secret)
//                .parseClaimsJws(token)
//                .getBody();
//    }
//
//    private Boolean isTokenExpired(String token) {
//        return extractExpiration(token).before(new Date());
//    }
//
//    public Boolean validateToken(String token) {
//        return !isTokenExpired(token);
//    }

}